﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;


namespace DAL
{
    public class DataAccessLayer
    {
        OleDbConnection sqlCon;
        OleDbDataAdapter sqlDat;
        private static DataAccessLayer localDal;

        /// <summary>
        /// Singleton van de DAL. Hierdoor wordt maar één keer een
        /// instantie van de DAL gecreëerd en bewaard.
        /// Later wordt deze instantie dan opgehaald als er naar
        /// de DAL verwezen wordt
        /// </summary>
        /// <returns></returns>
        public static DataAccessLayer GetInstance()
        {
            if (localDal == null)
                localDal = new DataAccessLayer();

            return localDal;
        }

        /// <summary>
        /// De contructor van de DAtaAccessLayer.
        /// Stelt de connectiestring in aan de hand van
        /// de geselecteerde database.
        /// </summary>
        public DataAccessLayer()
        {
            sqlCon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|Producten.accdb;Persist Security Info=True");
            sqlDat = new OleDbDataAdapter();
        }

        /// <summary>
        /// Opent de connectie naar de database.
        /// </summary>
        private void openSqlConnectie()
        {
            if (sqlCon.State == ConnectionState.Closed)
            {
                sqlCon.Open();
            }
        }

        /// <summary>
        /// Voert een bepaalde query uit in de database.
        /// Geeft het resultaat terug.
        /// </summary>
        /// <param name="query">De gehele query</param>
        /// <returns>De gevonden resultaten</returns>
        public DataSet GetData(string query)
        {
            DataSet dataset = new DataSet();
            sqlDat.SelectCommand = new OleDbCommand(query, sqlCon);
            sqlDat.Fill(dataset);
            return dataset;
        }

        public string VoegArtikelToe(string klasse, string naam, double prijs, int volume, string categorie)
        {
            string melding;

            openSqlConnectie();
            sqlDat.UpdateCommand =
                new OleDbCommand(
                    "INSERT INTO Artikel (Klasse,Naam,Prijs,Volume,Categorie) VALUES(" + "'" + klasse + "','" +
                    naam + "'," + prijs + "," + volume + ",'" +
                    categorie + "')", sqlCon);

            try
            {
                int rows = sqlDat.UpdateCommand.ExecuteNonQuery();
                melding = "Succesvol toegevoegd";
            }
            catch
            {
                melding = "Fout!";
            }

            sqlCon.Close();

            return melding;
        }

        public string VerwijderArtikel(int id)
        {
            string melding;

            openSqlConnectie();
            sqlDat.DeleteCommand = new OleDbCommand("DELETE FROM Artikel WHERE Id =" + id, sqlCon);

            try
            {
                int rows = sqlDat.DeleteCommand.ExecuteNonQuery();
                melding = "Gelukt";
            }
            catch
            {
                melding = "Fout";
            }
            sqlCon.Close();

            return melding;
        }

        /// <summary>
        /// Verwijdert een regel uit een Tabel
        /// </summary>
        /// <param name="Tabel">De tabelnaam</param>
        /// <param name="Kolomnaam">Een serie van kolommen</param>
        /// <param name="vergelijking">De waarden waarop de kolommen getoetst moeten worden</param>
        /// <returns></returns>
        public string VerwijderIets(string Tabel, List<string> Kolomnaam, List<string> vergelijking)
        {
            string antwoord;
            if (Kolomnaam.Count != vergelijking.Count)
            {
                antwoord = "Kolomnaam en vergelijking passen niet bij elkaar.";
            }
            else
            {
                string query = "DELETE FROM " + Tabel + " WHERE ";
                for (int t = 0; t < Kolomnaam.Count; t++)
                {
                    query = query + Kolomnaam[t] + " = " + vergelijking[t];
                    if (t + 1 < Kolomnaam.Count)
                    {
                        query = query + " AND ";
                    }
                }
                openSqlConnectie();
                sqlDat.DeleteCommand = new OleDbCommand(query, sqlCon);
                try
                {
                    int rows = sqlDat.DeleteCommand.ExecuteNonQuery();
                    antwoord = "Gelukt";
                }
                catch
                {
                    antwoord = "Faal";
                }
                sqlCon.Close();
            }

            return antwoord;
        }
    }
}
